2oneweek.dev

01.es3와 es5에서의 실행컨텍스트

    Tags

  • JavaScript
01.es3와 es5에서의 실행컨텍스트 thumbnail

ES3 주요 스펙

함수가 호출되엇을 때 함수가 실행 되었을 때 실행될 수 있도록하는 환경과 함수의 결과를 저장하는 영역. 즉 함수의 모든 처리는 이 안에서 이뤄진다

  • Function Object 엔진이 function 키워드를 만들었을 때 만드는 object
  • Excutable Code(실행 가능한 코드)의 종류
    1. Global Code
    2. Eval Code
    3. Function Code Eval Code는 문자열이고, Global Code와 Function Code는 똑같은 코드지만, 영역이 다르기 때문에 두개를 나눠놨다.
  • Variable Instantiation 변수의 인스턴스화 변수를 어떻게 인스턴스화 시켜서 처리할 것인가 하는 개념
  • Scope Chain과 Identifier Resolution(식별자 해결) id는 함수 이름과 변수 이름을 뜻한다. 식별자 해결(결정)은 함수를 호출했을 때 어떻게 함수 이름을 찾을 것이냐, 변수에 값을 설정했을 때 어떻게 변수 이름을 찾을 것인가
  • Global Object Function Object와 Global Object는 영역이 다르기 때문에, 두 개를 나눠놨다.
  • Activation Object 함수가 호출되었을 때, 함수가 실행될 수 있는 환경과, 함수의 결과를 저장하는 오브젝트다. 오브젝트 이므로 Activation Object에는 프로퍼티들이 존재한다.
  • This 인스턴스에서 위치를 나타냄
  • Arguments Object 함수의 파라미터를 처리하는 오브젝트

ES5의 주요 스펙

실행 컨텍스트는 ES3나 ES5에서 역할이 다르진 않다. 그러나 ES3에서 추가된 개념들을 알아보자.

  • Strict Mode Code ES3의 Executable Code 개념에 추가된 개념으로, use strict를 사용했을 때의 실행 모드를 뜻한다.

  • Lexical Environment Lexical은 dynamic에 반대되는 용어로 "정적"임을 의미한다. 자바스크립트는 "정적"환경을 취한다. 실행 컨텍스트가 하나의 실행의 묶음이라면, 그 안에서 환경적인 측면을 처리하는 것이 Lexical Environment다. Lexical Environment를 구성하는 하위개념은 다음과 같다.

    1. Environment Records 함수가 호출되어 "실행될 때" 그리고 "실행되기 전"에 정보를 기록하는 것
    2. Lexical Environment Operations 여러가지 의미가 있지만 "할당"이라고 봐도 될 듯하다. 어떤 변수에 값을 할당했을 때 그것을 "정적"인 환경에 설정한다는 것이다. 물론 Environment Record와 관련이 있다.
    3. Global Environment ES3의 Global Object를 처리하는 Environment다.
  • Declaration Binding Instantiation ES3에서 도입된 Variable Instantiation과 ES3에서 도입된 This와도 관계가 있다. 변수를 어떻게 실행컨텍스트의 environment에 record할 것이냐의 개념을 담고 있으며, this를 어떻게 binding 할 것이며 어떻게 record 할것이냐의 개념을 담고 있다.

함수와 관련된 키워드

  • Excution Context
    • Scope Chain & Identifier Resolution
    • Activation Object
    • Lexical Environment

여기서 정리한 키워드들은 "함수"와 관련이 있다. 자바스크립트에서 함수가 실행되기 전에 어떻게? 함수가 호출되었을 때 어떻게? 처리할 것이냐를 다룰 것이다.


실행 컨텍스트를 왜 묶음으로 가져가는가

왜 실행컨텍스트라는 환경을 묶음으로 묶는가?

  • 식별자 해결(Identifier Resolution)을 위함이다. 함수나 변수의 이름을 찾는데, 그것이 실행 컨텍스트 안에 있다면 찾기가 쉽기 때문이다.
  • 만약 실행 컨텍스트 바깥에 따로 정리해 둔다면, 따로 찾으러 왔다갔다 하는 로직이 있어야 되기 때문이다.(엔진 처리도 복잡해지고, 시간도 오래걸릴 것이다.)
    • 현재 컨텍스트가 실행중이라는 것의 의미는 지금 메모리에 로드되고 CPU를 할당 받은 것인데, 변수나 함수를 찾자고 Memory에 접근하는 것은 매우 비효율적이다. 따라서 한 함수에 사용될 변수나 다른 함수를 실행 컨텍스트라는 묶음에 저장하는 것이다.

묶음으로 나누다 보니까, Scope라는 개념이 파생되었다.

Written by@2-one-week
현재 블로그 개발 중

GitHubLinkedIn